#ifndef _HAL_ALGO_H_
#define _HAL_ALGO_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "hal_struct.h"

/**
 * @brief 算法结果回调函数指针类型
 * @param[out] pResult 算法识别结果
 * @param[in] pUserData 用户在注册回调时传递的自定义数据
 */
typedef void (*HAL_ALGO_CALLBACK_FN)(HAL_ALGO_REC_RESULT *pResult, void *pUserData);

/**
 * @function:   Hal_Algo_Start
 * @brief:      开启算法编码
 * @param[in]:  DSP_U8 u8SenIdx          视频输入通道号
 * @param[in]:  DSP_U32 encChan         编码通道号
 * @param[in]:  HAL_ALGO_CONFIG_S *pCfg  编码参数
 *
 * @return	返回DSP_SUCCESS-成功，其它值		失败，请参考错误码
 */
int32_t Hal_Algo_Start(HAL_ALGO_CONFIG_S *pCfg);

/**
 * @function:   Hal_Algo_Stop
 * @brief:      关闭算法通道
 * @param[in]:  DSP_U8 u8SenIdx   视频输入通道号
 * @param[in]:  HAL_ALGO_CONFIG_S *pCfg  编码参数
 *
 * @return  返回DSP_SUCCESS-成功，其它值        失败，请参考错误码
 */
int32_t Hal_Algo_Stop(HAL_ALGO_CONFIG_S *pCfg);

/**
 * @function:   Hal_Algo_RegisterCallback
 * @brief:      注册算法结果回调函数
 * @param[in]:  HAL_ALGO_CALLBACK_FN callback  回调函数指针
 * @param[in]:  void *pUserData                用户自定义数据
 *
 * @return  返回DSP_SUCCESS-成功，其它值        失败，请参考错误码
 */
int32_t Hal_Algo_RegisterCallback(HAL_ALGO_CALLBACK_FN callback, void *pUserData);

/**
 * @function:   Hal_Algo_UnregisterCallback
 * @brief:      注销算法结果回调函数
 *
 * @return  返回DSP_SUCCESS-成功，其它值        失败，请参考错误码
 */
int32_t Hal_Algo_UnregisterCallback(void);

/**
 * @function:   Hal_Algo_SetYoloClassLabels
 * @brief:      设置YOLO算法的类别标签
 * @param[in]:  labels  类别标签字符串数组指针，每个元素指向一个以'\0'结尾的字符串
 * @param[in]:  count   标签数量
 *
 * @return  返回DSP_SUCCESS-成功，其它值失败，请参考错误码
 *
 * @note:
 * - **内存管理**: 函数会立即深拷贝所有标签字符串，调用者可在函数返回后安全释放labels及其指向的所有字符串
 * - **调用时机**: 必须在Hal_Algo_Start()之前调用，或在算法停止后重新配置
 * - **标签格式**: labels数组中每个字符串必须以'\0'结尾，最大长度为HAL_ALGO_CLASS_NAME-1 (31字节)
 * - **异常处理**: 如果某个标签为NULL或超长，该标签将使用空字符串或截断，并记录警告日志
 * - **默认行为**: 如果未调用此函数或count为0，将使用内置的COCO 80类标签
 */
int32_t Hal_Algo_SetYoloClassLabels(const char **labels, uint32_t count);

#ifdef __cplusplus
}
#endif

#endif // _HAL_ALGO_H_
